package com.imooc.chapter03.less01.part01;

import org.junit.Test;

import java.math.BigDecimal;

/**
 * @author: bie
 * @create: 2022-03-15 22:37
 */
public class BigDecimalProblem {

    /**
     * scale设置精度与舍入方式
     */
    @Test
    public void testScale() {
        BigDecimal bigDecimal = new BigDecimal("12.222");
        // BigDecimal result = bigDecimal.setScale(2);
        // // java.lang.ArithmeticException: Rounding necessary 精度丢失,需要四舍五入
        BigDecimal result = bigDecimal.setScale(12);
        System.out.println("result = " + result);
        // result = 12.222000000000  // 补零
        BigDecimal result2 = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP); // 这个是四舍五入
        System.out.println("result2 = " + result2);  // 12.22
    }

    /**
     * 做除法时出现除不尽的情况
     */
    @Test
    public void testDivisionProblem() {
        // BigDecimal result = new BigDecimal(30).divide(new BigDecimal(7));
        // // java.lang.ArithmeticException:
        // //    Non-terminating decimal expansion; no exact representable decimal result.
        // // 非终止十进制扩展；没有精确可表示的十进制结果。
        BigDecimal result = new BigDecimal(30)
                .divide(new BigDecimal(7), 2, BigDecimal.ROUND_HALF_UP);
        System.out.println("result = " + result);  // 4.29
    }

    /**
     * 由于精度导致比较结果不相等
     */
    @Test
    public void testEqualityProblem() {
        BigDecimal result1 = new BigDecimal("0");
        BigDecimal result2 = new BigDecimal("0.0");
        System.out.println(result1.equals(result2));  // false
        // 原因: equals源码中"if (scale != xDec.scale)" 判断精度,精度不一致直接返回false
        System.out.println((result1.compareTo(result2) == 0));  // true
    }
}